package jvm;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 1、当jvm进程启动后，到类方法中找main()的入口类HelloJvm
 * 2、找到HelloJvm后读取该文件中的二进制数据，并且把类的信息放到运行时的方法区内存区中
 * 3、定位到HelloJvm中main方法的字节码中，并开始执行Main方法中的指令
 * 4、创建HellowJvm1的实例对象，并且使用helloJvm1引用对象：
 * （1）Jvm到方法区中查找HelloJvm1类的信息，此时发现没有该类的信息，由类加载器加载该HelloJvm类文件
 * （2）在Jvm的方法区中加载并且找到HelloJvm1类后会在栈中为HelloJvm1的实例对象分配内存
 * （3）Jvm实例化完成后会在当前线程中为栈中的引用建立实际的应用关系，此时会赋值给helloJvm1
 * 5、在Jvm中方法的调用一定属于线程的行为。方法的调用本身会发生在线程的方法调用栈。
 * 线程的方法调用栈，每一个方法的调用就是方法调用栈中的一个结构
 * 该结构包含了方法的参数、局部变量临时数据等。
 */
public class HelloJvm {

    public static void main(String[] args) {
        HellowJvmOne helloJvm1 = new HellowJvmOne("test");
        helloJvm1.sayHellow();
    }


}

class HellowJvmOne {

    private static final Logger logger = LoggerFactory.getLogger(HellowJvmOne.class);


    //name本身作为成员放在栈中，name指向的String对象是放在堆中
    private final String name;

    public HellowJvmOne(String test) {
        this.name = test;
    }

    //放在方法区中
    public void sayHellow() {
        logger.info("你好" + this.name);
    }
}
